
function isCover(tArr,sArr){
    for (let i = 'A'.charCodeAt(0); i <='Z'.charCodeAt(0) ; i++) {
        if(sArr[i]<tArr[i]){
            return false
        }
    }
    for (let i = 'a'.charCodeAt(0); i <='z'.charCodeAt(0) ; i++) {
        if(sArr[i]<tArr[i]){
            return false
        }
    }
    return true
}
/**
 * @param {string} s
 * @param {string} t
 * @return {string}
 */
var minWindow = function(s, t) {
    let tArr=new Array(128).fill(0) //记录目标字串的字符频率
    let sArr=new Array(128).fill(0) //记录窗口字串的字符频率
    for (let i = 0; i < t.length; i++) {
        tArr[t.charCodeAt(i)]++ // 统计目标字串频率
    }
    let left=0 //窗口左侧
    let ansLeft = -1, ansRight = s.length; //记录的最小字串左右下标，因为可能为""，所以不能是0和length
    for (let right = 0; right < s.length; right++) { //窗口不断扩张
        sArr[s.charCodeAt(right)]++ // 字符进入窗口
        //尝试移出字串左侧的字母，在覆盖的情况下，更新位置
        while(isCover(tArr,sArr)){ //一旦符合要求，尝试缩短窗口到不符合要求，每次都记录最小字串
            //如果有更短的字串
            if(right-left < ansRight-ansLeft){
                ansLeft=left
                ansRight=right
            }
            //最后一个移出去，虽然移出去可能导致不涵盖，但是上一次涵盖的位置已经被记录了，没有关系
            sArr[s.charCodeAt(left)]--
            left++
        }
    }
    //根据最小字串下标返回结果，可能为空
    return ansLeft<0?"":s.slice(ansLeft,ansRight+1)

};
let s = "ADOBECODEBANC"
let t = "ABC"
console.log(minWindow(s,t));